% TODO to be resynced with English version
\subsection{GCC---Ancora un'altra cosa}
\label{use_parts_of_C_strings}

Il fatto che una stringa C \IT{anonima} ha \IT{const} tipo (\myref{string_is_const_char}), 
e che le stringhe C allocate nel constants segment siano garantite essere immutabili, hanno una conseguenza interessante:
il compilatore potrebbe utilizzare una parte specifica della stringa.

Un esempio:

\begin{lstlisting}[style=customc]
#include <stdio.h>

int f1()
{
	printf ("world\n");
}

int f2()
{
	printf ("hello world\n");
}

int main()
{
	f1();
	f2();
}
\end{lstlisting}

I comuni compilatori \CCpp{}- (incluso MSVC) allocano due stringhe, ma vediamo cosa fa GCC 4.8.1:

\begin{lstlisting}[caption=GCC 4.8.1 + IDA,style=customasmx86]
f1              proc near

s               = dword ptr -1Ch

                sub     esp, 1Ch
                mov     [esp+1Ch+s], offset s ; "world\n"
                call    _puts
                add     esp, 1Ch
                retn
f1              endp

f2              proc near

s               = dword ptr -1Ch

                sub     esp, 1Ch
                mov     [esp+1Ch+s], offset aHello ; "hello "
                call    _puts
                add     esp, 1Ch
                retn
f2              endp

aHello          db 'hello '
s               db 'world',0xa,0
\end{lstlisting}

Quando stampiamo la stringa \q{hello world} le due parole sono posizionate adiacenti in memoria e \puts chiamata dalla funzione \GTT{f2(}) non è al corrente che la stringa è in divisa. Infatti non lo è; è divisa soltanto \q{virtualmente}, in questo listato.

Quando \puts è chiamata dalla funzione \GTT{f1()}, usa la stringa \q{world} più un byte zero. \puts non sa che c'è qualcos'altro prima di questa stringa!

Questo trucco intelligente è usato spesso, almeno da GCC, e può far risparmiare un po' di memoria.

